<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 封装队列类
      function Queue() {
        // 属性
        this.items = []

        // 方法
        // 1.将元素加入到队列中
        Queue.prototype.enqueue = function (element) {
          this.items.push(element)
        }

        // 2.从队列中删除前端的元素
        Queue.prototype.dequeue = function () {
          return this.items.shift()
        }

        // 3.查看前端的元素
        Queue.prototype.font = function () {
          return this.items[0]
        }

        // 4.查看队列是否为空
        Queue.prototype.isEmpty = function () {
          return this.items.length == 0
        }

        // 5.查看队列中元素的个数
        Queue.prototype.size = function () {
          return this.items.length
        }

        // 6.toString方法
        Queue.prototype.toString = function () {
          var resultString = ''
          this.items.forEach((element) => {
            resultString += element + ' '
          })
          return resultString
        }
      }

      // 使用队列
      var queue = new Queue()

      // 测试操作
      // queue.enqueue(1)
      // queue.enqueue(2)
      // queue.enqueue(3)
      // console.log(queue.items) // [1,2,3]
      // queue.dequeue()
      // queue.dequeue()
      // console.log(queue.items) // [3]
      // console.log(queue.font()) // 3
      // console.log(queue.isEmpty()) // false
      // console.log(queue.size()) // 1
      // console.log(queue.toString()) // 3

      // 面试题：击鼓传花
      function passGame(nameList, num) {
        // 1.创建一个队列结构
        var queue = new Queue()

        // 2.将所有人加入到队列中
        nameList.forEach((item) => {
          queue.enqueue(item)
        })

        // 3.开始数数字
        while (queue.size() > 1) {
          // 不是num的时候，重新加入到队列末尾
          // 是num的时候，将其从队列中删除
          // 3.1.num数字之前的人重新放入到队列的末尾
          for (var i = 0; i < num - 1; i++) {
            queue.enqueue(queue.dequeue())
          }
          // 3.2.num对应的这个人，直接从队列中删除
          queue.dequeue()
          // 思路：每次循环num-1次，当到num次时，队列前端是数据就是需要删除的数据
        }

        // 4.最后剩下的那个人
        console.log(queue.size())
        var endName = queue.font()
        console.log('最终剩下的人是：' + endName)

        return nameList.indexOf(endName)
      }

      // 测试击鼓传花
      names = ['张三', '李四', '王二', '张麻子']
      console.log(passGame(names, 3))
    </script>
  </body>
</html>
